home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue37 / DynArr / Array4U2.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1998-07-03  |  2.2 KB  |  93 lines

  1. unit Array4U2;
  2.  
  3. interface
  4.  
  5. uses
  6.   SysUtils;
  7.  
  8. const
  9. {$ifdef Win32}
  10.   MaxSize = 2147483647 div SizeOf(Integer);
  11. {$else}
  12.   MaxSize = 65535 div SizeOf(Integer);
  13. {$endif}
  14.  
  15. type
  16.   PIntArray = ^TIntArray;
  17.   TIntArray = array[0..Pred(MaxSize)] of Integer;
  18.  
  19.   EArrayError = class(Exception);
  20.  
  21.   TIntegerArray = class
  22.   private
  23.     FElements: PIntArray;
  24.     FSize: Integer;
  25.     function GetElement(Index: Integer): Integer;
  26.     procedure SetElement(Index: Integer; const Value: Integer);
  27.     procedure SetSize(const Value: Integer);
  28.   public
  29.     constructor Create(ArraySize: Integer);
  30.     destructor Destroy; override;
  31.     property Element[Index: Integer]: Integer
  32.       read GetElement write SetElement; default;
  33.     property Size: Integer read FSize write SetSize;
  34.   end; { TIntegerArray }
  35.  
  36. implementation
  37.  
  38. const
  39.   SOutOfBounds = 'Array index out of bounds';
  40.   STooBig = 'Array size too big';
  41.  
  42. { TIntegerArray }
  43.  
  44. constructor TIntegerArray.Create(ArraySize: Integer);
  45. begin
  46.   inherited Create;
  47.   if ArraySize > MaxSize then
  48.     raise Exception.Create('Array too big');
  49.   { Implicitly call SetSize by writing to the Size property }
  50.   { This means we re-use the ReallocMem and can get rid of the AllocMem }
  51.   Size := ArraySize;
  52. end;
  53.  
  54. destructor TIntegerArray.Destroy;
  55. begin
  56.   if Assigned(FElements) then
  57.   begin
  58.     FreeMem(FElements, FSize * SizeOf(Integer));
  59.     FElements := nil
  60.   end;
  61.   inherited Destroy
  62. end;
  63.  
  64. function TIntegerArray.GetElement(Index: Integer): Integer;
  65. begin
  66.   if (Index < 0) or (Index >= FSize) then
  67.     raise EArrayError.Create(SOutOfBounds);
  68.   Result := FElements^[Index]
  69. end;
  70.  
  71. procedure TIntegerArray.SetElement(Index: Integer; const Value: Integer);
  72. begin
  73.   if (Index < 0) or (Index >= FSize) then
  74.     raise EArrayError.Create(SOutOfBounds);
  75.   FElements^[Index] := Value
  76. end;
  77.  
  78. procedure TIntegerArray.SetSize(const Value: Integer);
  79. begin
  80.   if Value > MaxSize then
  81.     raise Exception.Create(STooBig);
  82. {$ifdef Win32}
  83.   ReallocMem(FElements, Value * SizeOf(Integer));
  84.   if Value > FSize then
  85.     FillChar(FElements^[FSize], (Value - FSize) * SizeOf(Integer), 0);
  86. {$else}
  87.   FElements := ReallocMem(FElements, FSize * SizeOf(Integer), Value * SizeOf(Integer));
  88. {$endif}
  89.   FSize := Value
  90. end;
  91.  
  92. end.
  93.